package c05面向对象;

/**
 * 垃圾回收并不等于执行finalize方法！finalize只是垃圾回收前可能会被调用的方法，即使它不会被调用，
 * 垃圾内存都会被回收！所以即使下面有个方法System.runFinalization();可以强制垃圾回收机制调用可恢复对象的finalize方法，
 * 也不能说明程序可以强制主动调用垃圾回收机制！
 *
 * @author 炜sama
 */
public class 垃圾回收之finalize方法 {
	private static 垃圾回收之finalize方法 ft = null;

	public void info() {
		System.err.println("info");
	}

	public void finalize() {
		//让ft引用到试图回收的可恢复对象，可恢复对象重新变成可达状态
		System.err.println("finalize");
		ft = this;
	}

	public static void main(String[] args) throws Exception {
		//匿名内部类对象创建后立马变成可恢复状态！
		new 垃圾回收之finalize方法();
		//通知系统进行资源回收
		System.gc(); //@1

		//以下代码仅保留A或B

		//@A
//		//让程序暂停2秒
//		Thread.sleep(2000);//@2

		//@B以下代码保留一行就行
		//如果不先调用@1就调用下面其中一个方法，会引发异常！因为finalize方法只能被垃圾回收机制调用，
		//如果回收机制不先启动怎么调用？而gc()方法通知回收机制回收垃圾可以使回收机制尽快启动：
		System.runFinalization();//其实内部就是调用Runtime.getRuntime().runFinalization();方法
//		Runtime.getRuntime().runFinalization();

		ft.info();
	}

}
